/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.transaction.UserTransaction;
import logica.entidades.Barcos;
import logica.entidades.Coordenada;
import logica.entidades.Isla;
import logica.entidades.Islas;
import logica.entidades.Jugadores;
import logica.entidades.Nivel;
import logica.entidades.Partida;
import logica.entidades.Partidas;
import logica.entidades.Puertos;
import logica.entidades.Turno;
import logica.entidades.Turnos;

/**
 *
 * @author Matias
 */
public class LogicaPersistencia {

    private ConsultasBD cosultasBD;
    
    public LogicaPersistencia() {
        
        cosultasBD = new ConsultasBD();
    }

    public void GuardarPartida(Partida partida)
    {
        try {
            cosultasBD.guardarBarcos(partida,1);
            cosultasBD.guardarNivel(partida);
            cosultasBD.guardarJugadores(partida);
            cosultasBD.guardarTurnos(partida);
            cosultasBD.guardarPartidasTurnos();
            
            
            /*
            //TURNOS
            Turnos turnos = partida.GetTurnos();
            Turno turnoActual = turnos.GetTurnoActual();
            Turno turnoSiguiente = turnos.GetTurnoSiguiente();
            List<Turnopers> turnosPers = new LinkedList<Turnopers>();
            Turnopers turnoP1 = new Turnopers(turnoActual.GetIdTurno());
            turnoP1.setContadorAcciones(turnoActual.GetAccionesDelTurno());
            turnosPers.add(turnoP1);
            Turnopers turnoP2 = new Turnopers(turnoSiguiente.GetIdTurno());
            turnoP1.setContadorAcciones(turnoSiguiente.GetAccionesDelTurno());
            turnosPers.add(turnoP2);
            Partidapers partidaPers = new Partidapers();
            partidaPers.setIdPartida(1);
            partidaPers.setTurnopersList(turnosPers);
            partidaPers.setTurnopersList(turnosPers);
            
            //JUGADORES

            //BARCOS
            
            EntityManagerFactory entityFactory = Persistence.createEntityManagerFactory("RiskyRiverServerPU");
            
            //BarcoJpaController bC = new BarcoJpaController(entityFactory);
            UserTransaction utx = null;
            JugadorpersJpaController jCon = new JugadorpersJpaController(utx, entityFactory);
                
            entityFactory.close();
            * */
        } catch (SQLException ex) {
            Logger.getLogger(LogicaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public int ObtenerUltimoIdBarco() 
    {
        int idBarco = -1;
        try
        {
            Barcos barcos = cosultasBD.ObtenerBarcos();
            if(barcos.CantidadBarcos() == 0)
            {
                idBarco = 0;
            }
            else
            {
                idBarco = barcos.GetBarco(barcos.CantidadBarcos() - 1).getId();
            }
        }
        catch(SQLException ex)
        {
             idBarco = -1;
             Logger.getLogger(FachadaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
        return idBarco;
    }
    public ArrayList<Coordenada> GetTrayectoria(int trayectoria) 
    {
        ArrayList<Coordenada>  result = new ArrayList<Coordenada>();
       try {
            result = cosultasBD.GetTrayectoria(trayectoria);
        } catch (SQLException ex) {
            Logger.getLogger(LogicaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
       return result;
    }
    public int ObtenerUltimoIdJugador() 
    {
        int idJugador = -1;
        try
        {
            Jugadores jugadores = cosultasBD.ObtenerJugadores();
            if(jugadores.CantidadJugadores() == 0)
            {
                idJugador = 0;
            }
            else
            {
                idJugador = jugadores.GetJugador(jugadores.CantidadJugadores() - 1).getId();
            }
        }
        catch(SQLException ex)
        {
             idJugador = -1;
             Logger.getLogger(FachadaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
        return idJugador;
    }
    
    public Nivel GetNivel(int idNivel) throws SQLException
    {
        Nivel nivel = new Nivel();
        try
        {
            nivel = cosultasBD.GetNivel(idNivel);
        }
        catch(SQLException ex)
        {
             Logger.getLogger(FachadaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
        return nivel;
    }
    public Islas GetIslas()
    {
        Islas islas  = new Islas();
        try
        {
            islas = cosultasBD.GetIslas();
        }
        catch(SQLException ex)
        {
             Logger.getLogger(FachadaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
        return islas;
    }
    public Puertos GetPuertos()
    {
        Puertos puertos  = new Puertos();
        try
        {
            puertos = cosultasBD.GetPuertos();
        }
        catch(SQLException ex)
        {
             Logger.getLogger(FachadaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
        return puertos;
    }
    
    //recupera la partida ingresada
    public Partida getPartida(int idPartida)
    {        
        
        Partida partida= new Partida();
        Jugadores jugadores= new Jugadores();
        Turnos turnos= new Turnos();
        Nivel nivel= new Nivel();
        
        try
        {
            //obtener los jugadores, turnos y nivel de la partida a recuperar
            jugadores= cosultasBD.getJugadores(idPartida);
            turnos= cosultasBD.getTurnos(idPartida);
            nivel = cosultasBD.getNivel(idPartida);
        }
        catch(SQLException ex)
        {
            Logger.getLogger(FachadaPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }
        return partida;
    }
}
